#pragma once

#include <memory>
#include <mutex>
#include <thread>
#include <unordered_map>
#include <vector>
#include <string>
#include <chrono>
#include <functional>
#include <deque>
#include "market_data_types.h"

namespace hft {

/**
 * @brief 数据管理器类
 * 
 * 负责管理市场数据和交易数据的订阅、存储和分发
 */
class DataManager {
public:
    DataManager();
    ~DataManager();

    /**
     * @brief 初始化数据管理器
     * @return 是否初始化成功
     */
    bool init();

    /**
     * @brief 订阅行情数据
     * @param symbol 交易对
     * @return 是否订阅成功
     */
    bool subscribe_market_data(const Symbol& symbol);

    /**
     * @brief 取消订阅行情数据
     * @param symbol 交易对
     * @return 是否取消成功
     */
    bool unsubscribe_market_data(const Symbol& symbol);

    /**
     * @brief 获取最新行情数据
     * @param symbol 交易对
     * @return 最新行情数据
     */
    MarketData get_latest_market_data(const Symbol& symbol);

    /**
     * @brief 获取历史行情数据
     * @param symbol 交易对
     * @param start_time 开始时间
     * @param end_time 结束时间
     * @return 历史行情数据列表
     */
    std::vector<MarketData> get_historical_market_data(
        const Symbol& symbol,
        const Timestamp& start_time,
        const Timestamp& end_time);

    /**
     * @brief 注册行情数据回调
     * @param callback 回调函数
     */
    void register_market_data_callback(
        std::function<void(const MarketData&)> callback);

    /**
     * @brief 注册交易数据回调
     * @param callback 回调函数
     */
    void register_trade_data_callback(
        std::function<void(const TradeData&)> callback);

private:
    /**
     * @brief 处理行情数据更新
     * @param data 行情数据
     */
    void on_market_data_update(const MarketData& data);

    /**
     * @brief 处理交易数据更新
     * @param data 交易数据
     */
    void on_trade_data_update(const TradeData& data);

    // 数据存储
    std::unordered_map<Symbol, std::deque<MarketData>> market_data_cache_;
    std::unordered_map<Symbol, std::deque<TradeData>> trade_data_cache_;

    // 回调函数
    std::function<void(const MarketData&)> market_data_callback_;
    std::function<void(const TradeData&)> trade_data_callback_;

    // 线程同步
    std::mutex market_data_mutex_;
    std::mutex trade_data_mutex_;

    // 数据管理线程
    std::thread data_thread_;
    bool running_;
};

} // namespace hft 
